不管哪一種程式語言都具備流程控制的功能,用來控制程式執行與流程的流向,透過流程控制可以讓程式更容易維護。
這次我們要討論 BEGIN...END 與 RETURN。
要讓多個 T-SQL 陳述式變成一個邏輯的區塊,就可以使用 BEGIN...END 來讓 SQL Server 把它們視為單一的區塊來處理。
至於 RETURN 則能夠立即無條件地終止一個查詢、預存程序或是批次,也就是說,位於 RETURN 之後的程式碼都不會被執行。
就拿先前討論的「如何使用 T-SQL 計算年齡」來作為範例,下面的程式碼是建立一個自訂計算年齡的函數,最後再呼叫這個函數:
-- 建立自訂函數
CREATE FUNCTION dbo.fn_GetAge(
@myDate datetime)
RETURNS int
AS
BEGIN
-- 宣告變數
DECLARE @age int, @day datetime
-- 以「年」為單位計算出年齡
SET @age = DATEDIFF(yy, @myDate, getdate()) -
CASE WHEN @day < DATEADD(yy, DATEDIFF(yy, @myDate, @day), @myDate)
THEN 1
ELSE 0
END
RETURN @age
END
GO
-- 呼叫自訂的函數
SELECT dbo.fn_GetAge('19990818') 年齡
執行結果如下:
下面的程式碼則是建立預存程序來計算年齡,然後自訂變數來接收預存程序傳回的結果,最後再使用 SELECT 把結果顯示出來:
-- 建立預存程序
CREATE PROCEDURE proc_GetAge1(
@myDate datetime)
AS
BEGIN
-- 宣告變數
DECLARE @age int, @day datetime
-- 以「年」為單位計算出年齡
SET @age = DATEDIFF(yy, @myDate, getdate()) -
CASE WHEN @day < DATEADD(yy, DATEDIFF(yy, @myDate, @day), @myDate)
THEN 1
ELSE 0
END
-- 使用 RETURN 傳回結果
RETURN @age
END
GO
-- 呼叫預存程序
DECLARE @result int
EXEC @result = dbo.proc_GetAge1 '19990818'
SELECT @result 年齡
執行結果如下:
我們可以看到再呼叫預存程序時,那樣的寫法有點囉唆,那是因為在預存程序裡面,使用 RETURN 傳回結果,如果改用 SELECT 的話,在呼叫預存程序時,就很簡單了:
-- 建立預存程序
CREATE PROCEDURE dbo.proc_GetAge2(
@myDate datetime)
AS
BEGIN
-- 宣告變數
DECLARE @age int, @day datetime
-- 以「年」為單位計算出年齡
SET @age = DATEDIFF(yy, @myDate, getdate()) -
CASE WHEN @day < DATEADD(yy, DATEDIFF(yy, @myDate, @day), @myDate)
THEN 1
ELSE 0
END
-- 使用 SELECT 傳回結果
SELECT @age
END
GO
-- 呼叫預存程序
EXEC dbo.proc_GetAge2 '19990818'
執行結果如下: